package ch.eureka.zuul.filter;

import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;

/**
 *  请求过滤
 *  用于权限的鉴定，token的检查等
 *  可以将内容放置ResponseBody中，如果异常，在异常过滤器中可以获取之前添加的ResponseBody内容来进行日志的记录
 */
public class AccessTokenFilter extends com.netflix.zuul.ZuulFilter{

    private static Logger log = LoggerFactory.getLogger(AccessTokenFilter.class);

    /**
     *  作用于哪个生命周期
     *      pre 请求路由前
     *      routing 路由请求时，请求转发给相应服务，服务回调回来之后
     *      post 在routing和error之后
     *      error 错误时
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 数值越小优先级越高
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        Object accessTolen = request.getParameter("accessToken");
        ctx.setResponseBody("pre过滤器的ResponseBody");
        // 抛出异常，自定义ErrorFiler捕获后进行操作
        doSoming();
        log.info("抛出异常后的操作");
        if(accessTolen == null){
            log.warn("accessToken is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            // 返回内容进行编辑
            ctx.setResponseBody("");

            return null;
        }
        log.info("accessToken is OK");
        return null;
    }

    private void doSoming() {
        throw new RuntimeException("123");
    }

}
